package com.haojin.java;

import org.junit.Test;

/**
 * 关于StringBuffer与StringBuilder的使用
 *
 * @author .29.
 * @create 2022-04-03 9:44
 */
public class StringBufferBuilderTest {
    /*
    对比三者效率：
    从效率高到低排序：StringBuilder > StingBuffer > String
     */

    /*
    StringBuffer()的常用方法：
StringBuffer append(xxx):提供了很多append()放啊，用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置
StringBuffer replace(int start,int end,String str):把[start，end)位置替换成str
StringBuffer insert(int offset,xxx):在指定位置插入xxx
StringBuffer reverse():把当前字符序列逆转
Public int indexOf(String str)：返回指定字符串内指定索引的下标
Public int length()：返回字符串长度
Public char charAt(int n)：返回某索引处的字符
Public String substring(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串
Public void setCharAt(int n,char ch)

          总结：
          增：append(xxx)
          删：delete(int start,int end)
          改：setCharAt(int n,char ch) /  replace(int start,int end,String str)
          查：charAt(int n)
          插： insert(int offset,xxx)
          长度：length()
          遍历：for() + charAt() / toString()
     */
    @Test
    public void test2(){

    }



    /*
    String StringBuffer StringBuilder 的异同？
    String:不可变的字符序列：底层使用char[]存储
    StringBuffer:可变的字符序列：线程安全的，效率低：底层使用char[]存储
    StringBuilder:可变的字符序列：5.0新增的，线程不安全的，效率高：底层使用char[]存储

    源码分析：
    String str = new String();//char[] value= new char[0]
    String str = new String("abc");//char[] value= new char[]{'a','b','c'};

    StringBuffer sb1 = new StringBuffer();//char[] value= new char[16];底层创建了一个长度是16的数组
    sb1.append('a');value[0] = 'a';
    sb1.append('b');value[1] = 'b';
    StringBuffer sb2 = new StringBuffer("abc");//char[] value= new char["abc".length() + 16];

    问题1：System.out,println(sb2.length());//3
    问题2：扩容问题：如果添加的数据底层装不下了，就需要扩容底层的数组
           默认情况下。扩容为原来的2倍+2，同时将原有数组中的元素复制到新的数组中

           指导意义：开发中建议使用StringBuffer(int capacity)或StringBuilder(int capacity)



     */

    @Test
    public void test(){
        StringBuffer sb1 = new StringBuffer("abc");
        sb1.setCharAt(0,'c');
        System.out.println(sb1);
    }
}
